<?php

namespace common\models;

use Yii;
use common\models\Doc;
use common\models\DocSearch;
use yii\base\NotSupportedException;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
use common\models\Word;
use common\models\Creditdetail;
/**
 * This is the model class for table "user".
 *
 * @property int $uid
 * @property string $username
 * @property string $auth_key  
 * @property string $password_hash
 * @property string $email
 * @property int $credit
 * @property int $groupid
 * @property int $createnum
 * @property int $editnum
 * @property string $password_reset_token
 * @property int $status 
 *
 * @property Doc[] $docs
 */
class User extends \yii\db\ActiveRecord implements IdentityInterface
{
	const STATUS_DELETED = 0;
    const STATUS_ACTIVE = 10;
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return '{{%user}}';
    }


    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            ['status', 'default', 'value' => self::STATUS_ACTIVE],
            ['status', 'in', 'range' => [self::STATUS_ACTIVE, self::STATUS_DELETED]],
         	[['email'], 'unique'],
        	[['email'], 'required'],
        	[['email'], 'email'],       
		];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'uid' => '用户ID',
            'username' => '用户名',
            'auth_key' => 'Auth Key',			
            'password_hash' => 'Password Hash',
            'email' => 'Email',
            'credit' => '积分',
            'groupid' => '分组',
            'createnum' => '创建词条数目',
            'editnum' => '编辑词条数目',
	        'password_reset_token' => 'Password Reset Token',
            'status' => '状态',			
        ];
    }

    /**
     * @inheritdoc
     */
    public static function findIdentity($id)
    {
        return static::findOne(['uid' => $id, 'status' => self::STATUS_ACTIVE]);
    }

    /**
     * @inheritdoc
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        throw new NotSupportedException('"findIdentityByAccessToken" is not implemented.');
    }

    /**
     * Finds user by username
     *
     * @param string $username
     * @return static|null
     */
    public static function findByUsername($username)
    {
        return static::findOne(['username' => $username, 'status' => self::STATUS_ACTIVE]);
    }

    /**
     * Finds user by password reset token
     *
     * @param string $token password reset token
     * @return static|null
     */
    public static function findByPasswordResetToken($token)
    {
        if (!static::isPasswordResetTokenValid($token)) {
            return null;
        }

        return static::findOne([
            'password_reset_token' => $token,
            'status' => self::STATUS_ACTIVE,
        ]);
    }

    /**
     * Finds out if password reset token is valid
     *
     * @param string $token password reset token
     * @return boolean
     */
    public static function isPasswordResetTokenValid($token)
    {
        if (empty($token)) {
            return false;
        }

        $timestamp = (int) substr($token, strrpos($token, '_') + 1);
        $expire = Yii::$app->params['user.passwordResetTokenExpire'];
        return $timestamp + $expire >= time();
    }

    /**
     * @inheritdoc
     */
    public function getId()
    {
        return $this->getPrimaryKey();
    }

    /**
     * @inheritdoc
     */
    public function getAuthKey()
    {
        return $this->auth_key;
    }

    /**
     * @inheritdoc
     */
    public function validateAuthKey($authKey)
    {
        return $this->getAuthKey() === $authKey;
    }

    /**
     * Validates password
     *
     * @param string $password password to validate
     * @return boolean if password provided is valid for current user
     */
    public function validatePassword($password)
    {
        return Yii::$app->security->validatePassword($password, $this->password_hash);
    }

    /**
     * Generates password hash from password and sets it to the model
     *
     * @param string $password
     */
    public function setPassword($password)
    {
        $this->password_hash = Yii::$app->security->generatePasswordHash($password);
    }

    /**
     * Generates "remember me" authentication key
     */
    public function generateAuthKey()
    {
        $this->auth_key = Yii::$app->security->generateRandomString();
    }

    /**
     * Generates new password reset token
     */
    public function generatePasswordResetToken()
    {
        $this->password_reset_token = Yii::$app->security->generateRandomString() . '_' . time();
    }

    /**
     * Removes password reset token
     */
    public function removePasswordResetToken()
    {
        $this->password_reset_token = null;
    }	
	    public function getBeginning($length=50)
    {
    	$tmpStr = strip_tags($this->content);
    	$tmpLen = mb_strlen($tmpStr);
    	 
    	$tmpStr = mb_substr($tmpStr,0,$length,'utf-8');
    	return $tmpStr.($tmpLen>$length?'...':'');
    }

    public function  getEditDocs()
    {
    	$docs=array();
    	foreach(array('post/index','PostSearch[tags]') as $tag)
    	{
    		$links[]=Html::a(Html::encode($tag),array('post/index','PostSearch[tags]'=>$tag));
    	}
    	return $links;
    }	
    public function getGroup()
    {
        return $this->hasOne(Usergroup::className(), ['groupid' => 'groupid']);
    }	
    public static function allStatus()
    {
    	return [self::STATUS_ACTIVE=>'正常',self::STATUS_DELETED=>'已拉入黑名单'];
    }
    
    public  function getStatusStr()
    {
    	return $this->status==self::STATUS_ACTIVE?'正常':'已拉入黑名单'; 
    }
	   public function getUrl()
    {
    	return Yii::$app->urlManager->createUrl(
    			['doc/detail','did'=>$this->did,'title'=>$this->title]);
    }
	    public function  getKeywordLinks()
    {
    	$links=array();
    	foreach(Word::string2array($this->keywords) as $word)
    	{
    		$links[]=Html::a(Html::encode($word),array('doc/index','DocSearch[keywords]'=>$word));
    	}
    	return $links;
    }
	    public static function findRecentDocs($limit=10)
    {
    	return Doc::find()->where(['locked'=>0])->orderBy('time DESC')
    	->limit($limit)->all();
    } 
	public static function findHotDocs($limit=10)
    {
    	return Doc::find()->where(['locked'=>0])
    	->limit($limit)->all();
    } 	
}
